<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
            原先:
            Object.defineProperty(劫持的对象,属性,{配置项})
            升级:
            Object.defineProperties(劫持的对象,{
                哪一个属性:{配置项},
                哪一个属性:{配置项}
                ....
            })
        
        
        
        
        */

        const obj = {name:'zhangsan',age:18};
        console.log('原始对象',obj);

        for(let k in obj){
            Object.defineProperties(obj,{
                // 第一步 需要复制一份属性  
                // 原来  叫name  _name
                // 原来  叫age   _age
                // 必须用数组关联语法
                ["&"+k]:{
                    value:obj[k],
                    writable:true,
                    enumerable:false
                },
                // 开始劫持  
                [k]:{
                    get(){
                        console.log(`你想获取${k}这个属性的值`);
                        return this["&"+k];
                    },
                    set(val){
                        console.log(`你想修改${k}这个属性的值,修改成${val}`);
                        this["&"+k] = val;
                    }
                }
            });
        }

        console.log('劫持后',obj);


        obj.name = 'mengzhiyuan';
        console.log('修改name后',obj);

        console.log(obj.name);  // 通过修改代理数据 原始数据发生变化
    </script>
</body>
</html>